package sgsi.controller.dao.impl;

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import sgsi.controller.dao.ClienteDao;
import sgsi.model.entidades.Cliente;
import sgsi.model.entidades.auxiliares.Direccion;

public class ClienteDaoHibernateImpl extends HibernateDaoSupport implements
		ClienteDao {

	private static final String BUSCAR_POR_CODIGO = "select c from Cliente c where c.estaBorrado is false and c.codigoCliente = ?";
	private static final String BUSCAR_DIRECCION = "select d from Direcciones d where d.codigoCliente = ?";
	private static final String BUSCAR_TODOS = "select c from Cliente c where c.estaBorrado is false and ";
	private static final String NOMBRECOMERCIAL = " c.nombreComercial  like ";
	private static final String APELLIDO = " c.apellidoContacto like ";
	private static final String NOMBRE = " c.nombreContacto   like ";
	private static final String BUSCAR_POR_EMPRESA = "select c from Cliente c where c.estaBorrado is false and c.nombreComercial like ?";
	private static final String OBTENER_TODOS = "select c from Cliente c where c.estaBorrado is false order by c.codigoCliente";

	public Cliente obtenerPorCodigo(int codigo) {
		if (getHibernateTemplate().find(BUSCAR_POR_CODIGO, codigo).isEmpty()) {
			return null;
		}
		return (Cliente) getHibernateTemplate().find(BUSCAR_POR_CODIGO, codigo).get(0);
	}

	public Cliente guardar(Cliente cliente) {
		getHibernateTemplate().saveOrUpdate(cliente);
		return null;
	}

	public Direccion obtenerDireccion(int codigo) {
		return (Direccion) getHibernateTemplate().find(BUSCAR_DIRECCION, codigo).get(1);
	}

	@SuppressWarnings("unchecked")
	public List<Cliente> obtenerTodos() {
		return getHibernateTemplate().find(OBTENER_TODOS);
	}

	@SuppressWarnings("unchecked")
	public List<Cliente> obtenerTodosBusqueda(String empresa, String apellido,
			String nombre, int paisSeleccionado, int provinciaSeleccionada,
			int localidadSeleccionada) {
		String newQuery = BUSCAR_TODOS + NOMBRECOMERCIAL + "'%" + empresa
				+ "%' AND " + APELLIDO + "'%" + apellido + "%' AND " + NOMBRE
				+ "'%" + nombre + "%'";
		if (localidadSeleccionada > 0) {
			newQuery = newQuery + " AND c.direccion.localidad = "
					+ localidadSeleccionada;
		} else if (provinciaSeleccionada > 0) {
			newQuery = newQuery + " AND c.direccion.localidad.provincia = "
					+ provinciaSeleccionada;
		} else if (paisSeleccionado > 0) {
			newQuery = newQuery
					+ " AND c.direccion.localidad.provincia.pais = "
					+ paisSeleccionado;
		}

		return getHibernateTemplate().find(newQuery);
	}

	@SuppressWarnings("unchecked")
	public List<Cliente> obtenerPorEmpresa(String empresa) {
		return getHibernateTemplate().find(BUSCAR_POR_EMPRESA,
				"%" + empresa + "%");
	}

	public void eliminar(Cliente cliente) {
		cliente.setInactivo(true);
		getHibernateTemplate().saveOrUpdate(cliente);
	}

	public void eliminar(int codigo) {
		eliminar(obtenerPorCodigo(codigo));
	}

	public List<Cliente> obtenerTodosBusqueda(String empresa, String apellido,
			String nombre) {
		return obtenerTodosBusqueda(empresa, apellido, nombre, 0,0,0);
	}

}
